/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package isd.facturacion.rn;

import isd.general.modelo.GR_Moneda;
import isd.general.modelo.GR_Sucursal;
import isd.general.rn.ComprobanteRN;
import isd.general.rn.MonedaRN;
import isd.general.rn.SucursalRN;
import isd.inventario.rn.ST_ListaPrecioRN;
import isd.ventas.modelo.VT_Cliente;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.ejb.LocalBean;
import isd.facturacion.dao.FC_FacturacionDAO;
import isd.facturacion.modelo.FC_Circuito;
import isd.facturacion.modelo.FC_ItemAnulacion;
import isd.facturacion.modelo.FC_ItemAplicacion;
import isd.facturacion.modelo.FC_ItemMovimiento;
import isd.facturacion.modelo.FC_ItemMovimientoPK;
import isd.facturacion.modelo.FC_ItemProducto;
import isd.facturacion.modelo.FC_Movimiento;
import isd.facturacion.modelo.FC_MovimientoPK;
import isd.facturacion.vista.FC_ItemPendiente;
import isd.general.excepciones.ExcepcionGeneralSistema;
import isd.general.modelo.GR_Comprobante;
import isd.general.modelo.GR_Formulario;
import isd.general.rn.FormularioRN;


/**
 *
 * @author Claudio
 */
@Stateless
@LocalBean
public class FC_MovimientoRN {

    @EJB private SucursalRN SucursalRN;
    @EJB private MonedaRN monedaRN;
    @EJB private FC_FacturacionDAO facturacionDAO;
    @EJB private ComprobanteRN comprobanteDAO;
    @EJB private ST_ListaPrecioRN listaPrecioRN;
    @EJB private FormularioRN formularioRN;
//    @EJB private GR_MailFactory mailFactory;

    public synchronized void guardar(FC_Movimiento m) throws Exception {

//        sincronizarCantidades(m);
//        generarItemsDetalleVacio(m);
//        generarItemsSerie(m);
//        generarComprobanteStock(m);
//        generarItemsAnulacion(m);
//        borrarItemsSerie(m);
//        puedoGuardarMovimiento(m);

//        if (m.getCircuito().getActzst()=='S' && m.getMovimientoInventario()!=null){
//            inventarioRN.guardar(m.getMovimientoInventario());
//        }

        formularioRN.actualizarUltimoNumero(m.getFormulario());
        facturacionDAO.crear(m);

        m.setPersistido(true);
    }

    public FC_Movimiento nuevoMovimiento(){
        return new FC_Movimiento();
    }

    public void calcularImportesDocumento(FC_Movimiento carrito) {

//        System.err.println("FC_Movimiento - calcular importes  - Falta implementación");

//        BigDecimal dd= new BigDecimal("0.00");
    }

    public FC_Movimiento nuevoMovimiento(VT_Cliente cliente,String modfor,String codfor, String circuito) {

        try {
            
            GR_Moneda coeficiente = monedaRN.getMoneda("ARS");
            BigDecimal cotizacionDia = monedaRN.getCotizacionDia("USD");
            GR_Sucursal  sucursal = SucursalRN.getSucursal("0001");

            FC_Movimiento m = new FC_Movimiento();
            FC_MovimientoPK mPK = new FC_MovimientoPK();

            mPK.setModfor(modfor);
            mPK.setCodfor(codfor);
////            mPK.setNrofor(comprobanteDAO.getNumeroComprobante(modfor, codfor));
//            m.setId(mPK);

            m.setSucursal(sucursal);
            m.setFchmov(new Date());

            m.setModgen(mPK.getModfor());
            m.setCodgen(mPK.getCodfor());
            m.setNrogen(mPK.getNrofor());
//
//            m.setCircom(circuito);
//            m.setCirapl(circuito);
//            m.setCirgen(circuito);
            m.setEstaut(Short.valueOf("0"));
            m.setCliente(cliente);            

            m.setNrosub(cliente.getNrocta());
            m.setVendedor(cliente.getVendedor());
            m.setCondicionDePago(cliente.getCondicionDePago());
            m.setCondicionDeIva(cliente.getCondicionDeIva());

            m.setCoeficienteDeuda(coeficiente);
            m.setCoeficienteEmision(coeficiente);
            m.setCoeficienteRegistracion(coeficiente);
            m.setCamsec(cotizacionDia);

            //Datos de entrega
            m.setJurisdiccion(cliente.getJurisdiccion());
            m.setPais(cliente.getPais());
            m.setCodigoPostalEntrega(cliente.getCodigoPostal());
            m.setDirent(cliente.getDirent());
            
            
//            m.setSitio(cliente.getSitio());
//            m.setDeposito(cliente.getSitio().getDeposito());
//            m.setSector(cliente.getSitio().getSector());
            m.setListaDePrecio(cliente.getListaDePrecio());
            m.setFeclis(new Date());
            m.setCongel('S');
            
            m.setItemsProducto(new ArrayList<FC_ItemProducto>());

            guardar(m);

            return m;
        } catch (Exception e) {
            System.err.println("Error al generar movimiento");
            e.printStackTrace();
            return null;
        }
    }

    public FC_Movimiento nuevoMovimiento(FC_Circuito circuito) throws ExcepcionGeneralSistema{

        //Comprobante principal
        GR_Comprobante comprobante = circuito.getComprobanteFacturacion();
        //Comprobante adicional  - Tesoreria
//        GR_Comprobante comprobanteCJ = circuito.getComprobanteValeConsumoSeleccionado();
//        //Comprobante adicional  - Stock
//        GR_Comprobante comprobanteST = circuito.getComprobanteParteProcesoSeleccionado();
//        //Comprobante adicional  - VT
//        GR_Comprobante comprobanteVT = circuito.getComprobanteParteProcesoSeleccionado();

        System.out.println(comprobante);

        FC_Movimiento m = crearMovimiento(circuito, comprobante);

//        if(comprobanteVC!=null){
//            FC_Movimiento mVC = crearMovimiento(circuito, comprobanteVC);
//            m.setValeConsumo(mVC);
//        }
//
//        if(comprobantePR!=null){
//            FC_Movimiento mPR = crearMovimiento(circuito, comprobantePR);
//            m.setParteProceso(mPR);
//        }
        return m;
    }

    private FC_Movimiento crearMovimiento(FC_Circuito circuito, GR_Comprobante comprobante) throws ExcepcionGeneralSistema{

        if(comprobante==null) throw new ExcepcionGeneralSistema("El comprobante no puede ser nulo");

        //Buscamos el formulario correspondiente
        GR_Formulario formulario = formularioRN.getFormulario(comprobante);

//        //incrementamos en 1 el numero de formulario
//        formulario.setUltimoNumero(formulario.getUltimoNumero() + 1);

        FC_Movimiento m = new FC_Movimiento(formulario);

        m.setPersistido(false);
        m.setCircuito(circuito);
        m.setComprobante(comprobante);
        m.setSucursal(formulario.getSucursal());

        m.setFchmov(new Date());

        if(comprobante.getDepositoIngreso()!=null && comprobante.getSectorIngreso()!=null){

            m.setDeposito(comprobante.getDepositoIngreso());
            m.setSector(comprobante.getSectorIngreso());
        }

        m.setItemsProducto(new ArrayList<FC_ItemProducto>());

//        if(comprobante.getDepositoEgreso()!=null && comprobante.getSectorEgreso()!=null){
//
//            m.setDepositoTransferencia(comprobante.getDepositoEgreso());
//            m.setSectorTransferencia(comprobante.getSectorEgreso());
//        }

        if(circuito.getCircuitoComienzo().equals(circuito.getCircuitoAplicacion())){
            m.getItemsProducto().add((FC_ItemProducto) nuevoItemProducto(m));
        }else{
            m.setItemsAplicacion(new ArrayList<FC_ItemAplicacion>());
        }

        if(m.getCircuito().getEsAnulacion().equals("S")){
            m.setItemsAnulacion(new ArrayList<FC_ItemAnulacion>());
        }

        return m;
    }

    public FC_ItemProducto nuevoItemProducto(FC_Movimiento m){

//        System.out.println("nuevoItemProducto");

        FC_ItemProducto nItem = new FC_ItemProducto();

        nItem.setModfor(m.getModfor());
        nItem.setCodfor(m.getCodfor());
        nItem.setNrofor(m.getNrofor());
        nItem.setNroitm(m.getItemsProducto().size()+1);

        //Items producto tiene nievel explotacion 1
        nItem.setNivexp("1");
        
        //Datos para aplicación
        nItem.setModapl(m.getModfor());
        nItem.setCodapl(m.getCodfor());
        nItem.setNroapl(m.getNrofor());
        nItem.setItmapl(m.getItemsProducto().size()+1);
        //Items producto tiene nievel explotacion 1
        nItem.setExpapl("1");
        
        nItem.setMovimiento(m);
        nItem.setMovimientoAplicacion(m);
        nItem.setMovimientoInicial(m);

        //Datos movimiento original
        nItem.setMovimientoOriginal(m);
        nItem.setModori(m.getModfor());
        nItem.setCodori(m.getCodfor());
        nItem.setNroori(m.getNrofor());

        nItem.setCantid(BigDecimal.ZERO);
        nItem.setPrecio(BigDecimal.ZERO);
        nItem.setTotlin(BigDecimal.ZERO);

        return nItem;
    }

    public FC_ItemAplicacion nuevoItemAplicacion(FC_Movimiento m, FC_ItemPendiente ip){

        FC_ItemAplicacion nItem = new FC_ItemAplicacion();

        nItem.setModfor(m.getModfor());
        nItem.setCodfor(m.getCodfor());
        nItem.setNrofor(m.getNrofor());
        nItem.setNroitm(m.getItemsAplicacion().size()+1);
        //Items aplicación tiene nievel explotacion 2
        nItem.setNivexp("2");
        
        //Datos para aplicación
        nItem.setModapl(ip.getModapl());
        nItem.setCodapl(ip.getCodapl());
        nItem.setNroapl(ip.getNroapl());
        nItem.setItmapl(ip.getItmapl());        
        nItem.setExpapl("2");

        //Datos comprobante original
        nItem.setModori(ip.getModori());
        nItem.setCodori(ip.getCodori());
        nItem.setNroori(ip.getNroori());


        nItem.setMovimiento(m);
        nItem.setMovimientoInicial(m);
        nItem.setMovimientoOriginal(m);

        return nItem;

    }

    public FC_ItemAnulacion nuevoItemAnulacion(FC_Movimiento m, FC_ItemMovimiento ip){

        FC_ItemAnulacion nItem = new FC_ItemAnulacion();

        nItem.setModfor(m.getModfor());
        nItem.setCodfor(m.getCodfor());
        nItem.setNrofor(m.getNrofor());
        nItem.setNroitm(m.getItemsAnulacion().size()+1);
        //Items anulación tiene nievel expresion 3
        nItem.setNivexp("3");        

        //Buscamos el items aplicación del items que estamos aplicando para anular el item aplicado
        FC_ItemMovimientoPK idPK = new FC_ItemMovimientoPK(ip.getModapl(), ip.getCodapl(), ip.getNroapl(), ip.getItmapl(), "2", ip.getModapl(), ip.getCodapl(), ip.getNroapl(), ip.getItmapl(), "2");
        
        FC_ItemMovimiento iAnulado = getItemAplicacion(idPK);
        //Datos para aplicación
        nItem.setModapl(iAnulado.getModapl());
        nItem.setCodapl(iAnulado.getCodapl());
        nItem.setNroapl(iAnulado.getNroapl());
        nItem.setItmapl(iAnulado.getItmapl());        
        nItem.setExpapl(iAnulado.getExpapl());

        //Datos comprobante original
        nItem.setModori(iAnulado.getModori());
        nItem.setCodori(iAnulado.getCodori());
        nItem.setNroori(iAnulado.getNroori());


        nItem.setMovimiento(m);
        nItem.setMovimientoInicial(m);
        nItem.setMovimientoOriginal(m);

        return nItem;
    }

    public FC_ItemAplicacion getItemAplicacion(FC_ItemMovimientoPK idPK) {

        return facturacionDAO.getItemAplicacion(idPK);
    }

    public boolean eliminarItemProducto(FC_Movimiento mov,  FC_ItemProducto nItem){

        boolean fItemBorrado = false;
        int i = 0;
        int indiceItemProducto = -1;
        int indiceItemAplicacion = -1;
        int indiceItemAnulacion = -1;

        for(FC_ItemProducto ip: mov.getItemsProducto()){

            if(ip.getProducto()!=null){

                if(ip.getProducto().equals(nItem.getProducto())){
                    indiceItemProducto = i;
                }
            }
            i++;
        }

        i = 0;

        //Buscamos indice de item aplicación
        if(mov.getItemsAplicacion()!=null){
            for(FC_ItemAplicacion a: mov.getItemsAplicacion()){

                if(a.getProducto().equals(nItem.getProducto())){
                    indiceItemAplicacion = i;
                }
                i++;
            }
        }

        //Buscamos indice de item anulación
        if(mov.getItemsAnulacion()!=null){
            for(FC_ItemAnulacion a: mov.getItemsAnulacion()){

                if(a.getProducto().equals(nItem.getProducto())){
                    indiceItemAnulacion = i;
                }
                i++;
            }
        }

        //Borramos los items productos
        if(indiceItemProducto>=0){
            FC_ItemProducto remove = mov.getItemsProducto().remove(indiceItemProducto);
            if(remove!=null){
                fItemBorrado = true;
            }
        }

        //Borramos los items aplicación si existen
        if(indiceItemAplicacion>=0){
            FC_ItemAplicacion remove = mov.getItemsAplicacion().remove(indiceItemAplicacion);
            if(remove!=null){
                fItemBorrado = true;
            }
        }

        //Borramos los items aplicación si existen
        if(indiceItemAnulacion>=0){
            FC_ItemAnulacion remove = mov.getItemsAnulacion().remove(indiceItemAnulacion);
            if(remove!=null){
                fItemBorrado = true;
            }
        }

        return fItemBorrado;
    }

 
}

